package cn.tedu.ivos.user.controller;

import cn.tedu.ivos.base.response.JsonResult;
import cn.tedu.ivos.base.response.StatusCode;
import cn.tedu.ivos.user.pojo.dto.UserLoginParamDTO;
import cn.tedu.ivos.user.pojo.dto.UserQueryDTO;
import cn.tedu.ivos.user.pojo.dto.UserSaveParamDTO;
import cn.tedu.ivos.user.pojo.vo.UserVO;
import cn.tedu.ivos.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController//http://localhost:8080/v1/user/login
@RequestMapping("/v1/user/")
public class UserController {//controller和service必须打印日志

    //注入业务层对象,注意:注入的是业务层接口!
    @Autowired
    UserService userService;

    @PostMapping("/login")// "login"前边的/ 可以不写， spring会自动拼接
    public JsonResult login(@RequestBody UserLoginParamDTO userLoginParam){
        //因为前端页面用post方式传递过来的是一个json对象，所以这里需要使用@RequestBody注解（解析post方式的json对象用的）
        //因为post请求的请求参数是放在请求体中提交的，所以要用@RequestBody注解
        log.debug("UserController---用户登录:userLoginParam={}",userLoginParam);
        //调用业务层方法,如果业务层方法成功执行完毕,可以拿到业务层返回的usrVO
        UserVO userVO = userService.login(userLoginParam);
        //控制层向前端返回登录成功后的完整用户信息userVO
        //将查到的userVO装到.ok()中一起返回给前端
        return JsonResult.ok(userVO);
    }

    @PostMapping(value="/save",consumes = MediaType.APPLICATION_JSON_VALUE)
    public JsonResult saveUser(@RequestBody UserSaveParamDTO userLoginParam){
        log.debug("UserController---用户注册:userLoginParam={}",userLoginParam);
        String msg=userService.saveOrUpdateUser(userLoginParam);
        return JsonResult.ok(StatusCode.SUCCESS.getCode(), msg);
    }

    //因为前端页面用let data= qs.stringify(searchUserForm.value);通过get方式传过来了一个json字符串，
    //所以这里不需要使用@RequestBody注解
    //@GetMapping("/selectUsers")
    @GetMapping("/select")
    public JsonResult selectAll(UserQueryDTO userQueryDTO){
        List<UserVO> userList=userService.selectUsers(userQueryDTO);
        log.debug("UserController---查询用户:userList={}",userList);
        return JsonResult.ok(userList);
    }

    @PostMapping("/resetPwd/{userId}")
    public JsonResult resetPwd(@PathVariable("userId") Long  userId){
        //@PathVariable Long  userId：用于获取restful风格的url中的参数值赋值给方法参数userId
        log.debug("UserController---密码重置:userId={}",userId);
        userService.resetPassword(userId);
        return JsonResult.ok();
    }

    @PostMapping("/update/password/{userId}")
    public JsonResult resetPwd2(@PathVariable("userId") Long  userId){
        //@PathVariable Long  userId：用于获取restful风格的url中的参数值赋值给方法参数userId
        log.debug("UserController---密码重置:userId={}",userId);
        userService.resetPassword(userId);
        return JsonResult.ok();
    }

    @PostMapping("/update/status/{userId}/{status}")
    public JsonResult updateStatus(@PathVariable("userId") Long  userId, @PathVariable("status") String status){
        //@PathVariable Long  userId：用于获取restful风格的url中的参数值赋值给方法参数userId
        log.debug("UserController---状态修改:userId={},status={}",userId, status);
        userService.updateStatus(userId,status);
        return JsonResult.ok();
    }

    @PostMapping("/delete/{userId}")
    public JsonResult deleteUser(@PathVariable("userId") Long  userId){
        //@PathVariable Long  userId：用于获取restful风格的url中的参数值赋值给方法参数userId
        log.debug("UserController---状态修改:userId={}",userId);
        userService.deleteUser(userId);
        return JsonResult.ok();
    }

    //查询审批人
    @GetMapping(value={"/selectAudits/{parentId}","/select/audit/{parentId}"})  //Audit意思： 审批的
    public JsonResult selectAudits( @PathVariable("parentId")  Long  parentId){
        //@PathVariable Long  userId：用于获取restful风格的url中的参数值赋值给方法参数userId
        log.debug("UserController---selectAudits{}",parentId);
        List<UserVO> userList=userService.selectAuditList(parentId);
        return JsonResult.ok(userList);
    }

}


